/* 
 * File:   assign.h
 * Author: haoliang.donghl
 *
 * Created on 2009年7月14日, 下午2:22
 */

#ifndef _ASSIGN_H
#define	_ASSIGN_H

//#define DEBUG

const int STATE_RUNNING = 1;
const int STATE_INSTANCE = 0;
const int STATE_NOTHING = -1;
const float COST_SIZE_COFF = 1;
const float COST_F5_COFF = 5;

extern int numOfApp;                   //app的数量
extern int numOfPM;                    //物理机的数量
extern float upBound, lowBound;        //理想状态下机器负载的阈值范围
extern int** matrixAssign;             //分配矩阵，表明App是否在PM上运行，以及是否存在实体
extern float** matrixState;            //状态矩阵，用来表明每个App在每个PM上的负载
extern float* vectorAppCPU;            //每个App所需要的计算能力
extern bool* vectorAvailable;          //该机器是否处于开启状态
extern int* vectorAppSize;             //每个应用的大小，用于计算部署代价

int checkConstraint(int** matrix);
float calculateCost();

void initMatrix();
void destoryMatrix();
void copyArray(int** dest, int** src);

void calculateMatrixState();
void calculateMatrixCost();
void calculateAppNeeds();

void doCalculate();
void doAssign(int p);
void chooseMinAndAssign(float* sizes, float* values, int p);
void getMinValue(int app, int machine, float* sizes, float* values, int* assigns);


int getMachineNeeds();
int getMachineRunning();

void shutdownMachine(int n);
void turnonMachine(int n);

void printAssign();
void printCost();
void printState();
void printMachine();

#endif	/* _ASSIGN_H */

